package com.back_end.Reflection;

import com.TestDemo.TestBean;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/*
* 获得类的信息
* */
public class GetClassStruct {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
        Class<?> aClass = Class.forName("com.back_end.Reflection.User");

        // 获得类的名字
        System.out.println(aClass.getName()); // 获得包名+类名
        System.out.println(aClass.getSimpleName()); // 获得类名


        System.out.println("属性打印开始！");
        // 获得类的属性
        Field[] field = aClass.getFields(); // 只能获得public属性
        Field[] declaredFields = aClass.getDeclaredFields();

        for (int i = 0; i < declaredFields.length; i++) {
            System.out.println(declaredFields[i]);
        }

        System.out.println("属性打印完毕！");

        // 获得指定属性的值
        Field name = aClass.getDeclaredField("name");
        System.out.println(name);


        // 获得所有的方法
        Method[] methods = aClass.getMethods();
        Method[] declaredMethods = aClass.getDeclaredMethods();

        System.out.println("methods:-----");
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("declaredMethods:---------");
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }

        System.out.println("获取指定的方法：---");
        // 获取指定方法 --- 需要参数，因为重载问题，不指定将报错。
        Method getName = aClass.getMethod("getName", null); // 方法名+参数
        System.out.println(getName);

        Method setName = aClass.getMethod("setName", String.class);
        System.out.println(setName);


        System.out.println("获取构造器：---");
        // 获得构造器
        Constructor<?>[] constructors = aClass.getConstructors();
        Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();


        System.out.println("constructor---------");
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }

        System.out.println("declaredConstructor--------------");
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }


        System.out.println("获取指定参数的构造器：");
        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class, int.class); // 依据参数获取构造器
        System.out.println(declaredConstructor);



    }

}
